home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H055.ZIP / MAC / API.MLC next >
Text File  |  1988-01-01  |  16KB  |  446 lines

  1.          TITLE 'PC/370 APPLICATION PROGRAM INTERFACE SURBOUTINES'
  2. * PGMID.       API.MLC
  3. * AUTHOR.      DON HIGGINS.
  4. * DATE.        11/03/87
  5. * REMARKS.     THIS SET OF CALLABLE SUBROUTINES SUPPORTS THE
  6. *              IBM PC 3270 APPLICATION PROGRAM INTERFACE (API) TO
  7. *              ALLOW PROGRAM SIMULATION OF 3270 TRANSACTIONS.
  8. *
  9. *              THE CURRENT ENTRY POINTS AND ARGUMENTS ARE AS FOLLOWS:
  10. *
  11. *              ENTRY       FUNCTION         ARGUMENTS
  12. *
  13. *              APISTART    START SESSION    NONE
  14. *              APIAID      WRITE AID KEY    R1 = AID SCAN CODE
  15. *              APIWRITE    WRITE KEYBOARD   R1 = KEYBOARD PARM LIST WITH LENGTH
  16. *                                                FOLLOWED BY ASCII+SHIFT HWORDS
  17. *              APIREAD     READ SCREEN      R1 = ADDRESS OF 24 X 80 SCREEN AREA
  18. *              APIWAIT     WAIT A WHILE     R1 = SECONDS TO WAIT
  19. *
  20. * MAINTENANCE.
  21. *
  22. * 11/04/87 DSH  1.  DEBUG ON LIVE SYSTEM TO FIX REVERSED LIST SEG:OFF,
  23. *                   MVC'S WITHOUT EXPLICIT LENGTH TO ARG. LISTS, ETC.
  24. * 11/05/87 DSH  1.  ADD ARG. LIST RETURN CODE CHECKS TO QID, AID, AND
  25. *                   COPY FUNCTIONS; FIX CKD ARG MVC, FIX WAIT TIME LOGIC.
  26. *                   REMOVE TEST HOOKS TO SKIP INT 7A TEST AND SVC NOP
  27. *               2.  CHECK IF KEYBOARD ALREADY CONNECTED.
  28. *               3.  ADD READ OPERATOR INFORMATION TO DETECT INHIBIT AND
  29. *                   WAIT FOR AID FUNCTION TO COMPLETE
  30. * 11/09/87 DSH  1.  ADD MIDNIGHT CHECK TO ELIMINATE ENDLESS LOOP
  31. * 12/29/87 DSH  1.  ADD APITRAN TO ISSUE ASCII CICS TRANSACTION ID
  32. *                   PASSED IN R1 WITH LENGTH IN R2.
  33. *
  34. API      CSECT
  35. *
  36. * START API INTERFACE TO ALLOW FOLLOWING READ/WRITE CALLS
  37. *
  38.          ENTRY APISTART
  39. APISTART EQU   *
  40.          STM   R14,R12,12(R13)
  41.          BALR  R12,0
  42.          USING *,R12
  43.          LA    R11,PCB
  44.          USING IHAPCB,R11
  45. *
  46. * VERIFY API INTERRUPT INSTALLED
  47. *
  48.          LA    R1,4*X'7A'  ABSOLUTE ADDRESS OF PC INTERRUPT 7A
  49.          LA    R2,4        LENGTH
  50.          MVCP  ADDRAPI(R2),0,R1    COPY ADDRESS TO PC/370 ADDR SPACE
  51.          L     R0,ADDRAPI
  52.          LTR   R0,R0
  53. ***
  54. *        B     APIOK       ******* FORCE OK FOR TEST WITH SVC NOP'D
  55. ***
  56.          BNZ   APIOK
  57.          WTO   'API INTERRUPT 7A NOT INSTALLED'
  58.          SVC   EXIT
  59. APIOK    EQU   *
  60.          LM    R0,R3,=A(BUFFER,2*1920,0,X'20000000')
  61.          MVCL  R0,R2
  62. *
  63. * GET GATE ID'S
  64. *
  65.          LA    R1,=C"SESSMGR "
  66.          BAL   R14,GETID
  67.          MVC   SESGID,PCDX      SAVE SESSMGR GATE ID
  68.          LA    R1,=C"KEYBOARD"
  69.          BAL   R14,GETID
  70.          MVC   KEYGID,PCDX      SAVE KEYBOARD GATE ID
  71.          LA    R1,=C"COPY    "
  72.          BAL   R14,GETID
  73.          MVC   CPYGID,PCDX      SAVE COPY GATE ID
  74.          LA    R1,=C"OIAM    "
  75.          BAL   R14,GETID
  76.          MVC   OIAGID,PCDX      SAVE OIAM GATE ID
  77. *
  78. * GET SESSION ID
  79. *
  80.          MVC   PCAX,=X'0901'    SET PARMS TO OBTAIN SESSION ID
  81.          MVC   PCBX,=X'8020'
  82.          MVC   PCCX,=X'0000'
  83.          MVC   PCDX,SESGID
  84.          LA    R1,QSIDPARM
  85.          SVC   CVVASG
  86.          STCM  0,X'C',PCES
  87.          STCM  0,X'3',PCDI     SET ES:DI TO QUERY SESSION ID PARM
  88.          LA    R1,QSNARRAY
  89.          SVC   CVVASG
  90.          STCM  0,X'8',QSIDNASG+1
  91.          STCM  0,X'4',QSIDNASG
  92.          STCM  0,X'2',QSIDNAOF+1 SET SEG:OFFSET TO NAME ARRAY IN PARM
  93.          STCM  0,X'1',QSIDNAOF SET SEG:OFFSET TO NAME ARRAY IN PARM
  94.          SVC   TRACE
  95.          DC    C'QID'
  96.          BAL   R10,APISVC      GET SESSION ID
  97.          CLI   QSIDPARM,0      CHECK API QID RETURN CODE (SEE 2-18)
  98.          BNE   APIERR
  99. *
  100. * CONNECT TO KEYBOARD
  101. *
  102.          MVC   PCAX,=X'0901'    SET PARMS TO CONNECT KEYBOARD
  103.          MVC   PCBX,=X'8020'
  104.          MVC   PCCX,=X'0000'
  105.          MVC   PCDX,KEYGID
  106.          MVC   KEYPARM(10),=XL10'00' CLEAR KEYPARM  2-28
  107.          MVC   KEYPARM+2(1),SESSID
  108.          LA    R1,KEYPARM
  109.          SVC   CVVASG
  110.          STCM  0,X'C',PCES
  111.          STCM  0,X'3',PCDI     SET ES:DI TO CONNECT KEY PARM
  112.          SVC   TRACE
  113.          DC    C'CKD'
  114.          BAL   R10,APISVC      CONNECT KEYBOARD
  115.          CLI   KEYPARM,4       IS KEYBOARD ALREADY CONNECTED
  116.          BE    CKDOK
  117.          CLI   KEYPARM,0       CHECK CKD RETURN CODE (SEE 2-28)
  118.          BNE   APIERR
  119. CKDOK    EQU   *
  120.          LM    R14,R12,12(R13)
  121.          SR    R15,R15
  122.          BR    R14
  123. *
  124. * WRITE AID CODE IN R1
  125. *
  126.          ENTRY APIAID
  127. APIAID   EQU   *
  128.          STM   R14,R12,12(R13)
  129.          BALR  R12,0
  130.          USING *,R12
  131.          LA    R11,PCB
  132.          BAL   R14,UNLOCK       UNLOCK KEYBOARD
  133.          MVC   PCAX,=X'0904'    SET PARMS TO WRITE TO KEYBOARD
  134.          MVC   PCBX,=X'8020'
  135.          MVC   PCCX,=X'0000'
  136.          MVC   PCDX,KEYGID
  137.          MVC   KEYPARM(12),=XL12'00' CLEAR KEYPARM  2-37
  138.          MVC   KEYPARM+2(1),SESSID
  139.          MVI   KEYPARM+6,X'20'        SINGLE KEY OPTION
  140.          STC   R1,KEYPARM+8           STORE AID CHARACTER
  141.          MVI   KEYPARM+9,X'00'        SET AID SHIFT CODE TO ZERO (A-2)
  142.          LA    R1,KEYPARM
  143.          SVC   CVVASG
  144.          STCM  0,X'C',PCES
  145.          STCM  0,X'3',PCDI     SET ES:DI TO CONNECT KEY PARM
  146.          SVC   TRACE
  147.          DC    C'AID'
  148.          BAL   R10,APISVC      WRITE KEYBOARD
  149.          CLI   KEYPARM,X'12'   CHECK API AID RC FOR AID GENERATED (2-39)
  150.          BNE   APIERR
  151.          LM    R14,R12,12(R13)
  152.          SR    R15,R15
  153.          BR    R14
  154. *
  155. * WRITE ASCII TRANSACTION (R1=ADDRESS AND R2=LENGTH)
  156. *
  157.          ENTRY APITRAN
  158. APITRAN  EQU   *
  159.          STM   R14,R12,12(R13)
  160.          BALR  R12,0
  161.          USING *,R12
  162.          LA    R0,1(R2)  R0 = NUMBER OF CHAR +1 (FOR ENTER KEY)
  163.          MH    R0,=H'2'
  164.          STCM  R0,X'2',WTRAN+1
  165.          STCM  R0,X'1',WTRAN+0
  166.          LA    R3,WTRAN+2
  167. WMOVE    EQU   *
  168.          MVC   0(1,R3),0(R1)    MOVE ASCII TRANACTION BYTE
  169.          MVI   1(R3),ASCICODE   MOVE ASCII SHIFT BYTE
  170.          LA    R1,1(R1)
  171.          LA    R3,2(R3)
  172.          BCT   R2,WMOVE
  173.          MVC   0(2,R3),=AL1(ENTERKEY,SCANCODE)
  174.          LA    R1,WTRAN
  175.          B     APIWRBE
  176. *
  177. * WRITE THE KEYBOARD STRING POINTED TO BY R1 (SEE 2-37)
  178. *
  179. * R1 MUST POINT TO 2 BYTE LENGTH CONTAINING 2*(NUMBER OF KEYS) FOLLOWED
  180. * BY PAIRS OF ASCII CHARACTERS PLUS SHIFT CODES.
  181. *
  182.          ENTRY APIWRITE
  183. APIWRITE EQU   *
  184.          STM   R14,R12,12(R13)
  185. APIWRBE  EQU   *                BRANCH ENTRY FROM APITRAN
  186.          BALR  R12,0
  187.          USING *,R12
  188.          LA    R11,PCB
  189.          BAL   R14,UNLOCK       UNLOCK KEYBOARD
  190.          MVC   PCAX,=X'0904'    SET PARMS TO WRITE TO KEYBOARD
  191.          MVC   PCBX,=X'8020'
  192.          MVC   PCCX,=X'0000'
  193.          MVC   PCDX,KEYGID
  194.          MVC   KEYPARM(12),=XL12'00' CLEAR KEYPARM  2-37
  195.          MVC   KEYPARM+2(1),SESSID
  196.          MVI   KEYPARM+6,X'30'  MULTIPLE KEY OPTION
  197.          SVC   CVVASG           CONVERT R1 KEY LIST ADDR TO SEG:OFFSET
  198.          STCM  0,X'8',KEYPARM+10+1
  199.          STCM  0,X'4',KEYPARM+10
  200.          STCM  0,X'2',KEYPARM+8+1 STORE SEGlOFF TO KEY LIST PARM
  201.          STCM  0,X'1',KEYPARM+8 STORE SEGlOFF TO KEY LIST PARM
  202.          LA    R1,KEYPARM
  203.          SVC   CVVASG
  204.          STCM  0,X'C',PCES
  205.          STCM  0,X'3',PCDI     SET ES:DI TO CONNECT KEY PARM
  206.          SVC   TRACE
  207.          DC    C'WKL'
  208.          BAL   R10,APISVC      WRITE KEYBOARD
  209.          CLI   KEYPARM,X'12'   AID KEY GENERATED
  210.          BE    APIWROK
  211.          CLI   KEYPARM,0       CHECK API WKL WRITE RETURN CODE
  212.          BNE   APIERR
  213. APIWROK  EQU   *
  214.          LM    R14,R12,12(R13)
  215.          SR    R15,R15
  216.          BR    R14
  217. *
  218. * READ CURRENT 24 X 80 3270 SCREEN INTO AREA AT R1
  219. *
  220.          ENTRY APIREAD
  221. APIREAD  EQU   *
  222.          STM   R14,R12,12(R13)
  223.          BALR  R12,0
  224.          USING *,R12
  225.          LA    R11,PCB
  226.          BAL   R14,UNLOCK
  227.          LR    R9,R1            SAVE SCREEN ADDRESS
  228.          MVC   PCAX,=X'0901'    SET PARMS TO READ SCREEN
  229.          MVC   PCBX,=X'8020'
  230.          MVC   PCCX,=X'00FF'
  231.          MVC   PCDX,CPYGID
  232.          MVC   CPYPARM(26),=XL26'00' CLEAR COPY PARM  2-60
  233.          MVC   CPYPARM+2(1),SESSID
  234.          L     R1,=A(BUFFER)
  235.          SVC   CVVASG           CONVERT BUFFER TO SEG:OFFSET
  236.          STCM  0,X'8',CPYPARM+18+1
  237.          STCM  0,X'4',CPYPARM+18
  238.          STCM  0,X'2',CPYPARM+16+1 STORE SEG:OFF TO BUFFER
  239.          STCM  0,X'1',CPYPARM+16 STORE SEG:OFF TO BUFFER
  240.          MVI   CPYPARM+9,X'02'   SET SOURCE TYPE
  241.          LA    R0,1919
  242.          STCM  R0,2,CPYPARM+13
  243.          STC   R0,CPYPARM+12     SET SOURCE ENDING CHARACTER OFFSET
  244.          MVI   CPYPARM+21,X'05'  SET TARGET TYPE TO PC ASCII BUFFER
  245.          MVI   CPYPARM+24,X'00'  SET NO 3270 ATTRIBUTES (SEE 2-62)
  246.          LA    R1,CPYPARM
  247.          SVC   CVVASG
  248.          STCM  0,X'C',PCES
  249.          STCM  0,X'3',PCDI     SET ES:DI TO CONNECT KEY PARM
  250.          SVC   TRACE
  251.          DC    C'CPY'
  252.          BAL   R10,APISVC      READ SCREEN
  253.          CLI   CPYPARM,0       CHECK READ OK
  254.          BNE   APIERR
  255.          L     R2,=A(BUFFER)
  256.          LA    R3,24
  257. ROWLOOP  EQU   *
  258.          LA    R1,80
  259.          LR    R4,R9            SAVE STARTING ROW ADDRESS OF SCREEN
  260. COLLOOP  EQU   *                COPY ASCII TO SCREEN AREA FROM BUFFER
  261.          MVC   0(1,R9),0(R2)
  262.          LA    R9,1(R9)
  263.          LA    R2,2(R2)         SKIP ATTIRBUTES
  264.          BCT   R1,COLLOOP
  265.          TR    0(80,R4),TRTTAB     CONVERT X'00' TO ASCII BLANKS
  266.          MVC   78(2,R4),=X'0D0A'   FORCE CR AND LINE FEED ON EACH LINE
  267.          BCT   R3,ROWLOOP
  268.          LM    R14,R12,12(R13)
  269.          SR    R15,R15
  270.          BR    R14
  271. *
  272. * WAIT FOR (R1) SECONDS
  273. *
  274.          ENTRY APIWAIT
  275. APIWAIT  EQU   *
  276.          STM   R14,R12,12(R13)
  277.          BALR  R12,0
  278.          USING *,R12
  279.          LA    R11,PCB
  280.          MH    R1,=H'100' CONVERT TO 100TH SEC
  281.          ST    R1,TARGET
  282.          LA    R15,APISAVE    CONNECT STD. SAVE AREA FOR CALL TO TIMER
  283.          ST    R13,APISAVE+4
  284.          ST    R15,8(R13)
  285.          LR    R13,R15
  286.          CALL  TIMER
  287.          ST    R0,NOW         TIME NOW
  288.          A     R0,TARGET
  289.          ST    R0,TARGET      TIME AT END OF WAIT IN 100TH SEC.
  290. WAITLOOP EQU   *
  291.          CALL  TIMER
  292.          CL    R0,NOW         CHECK IF TIME LESS DUE TO MIDNIGHT RESET
  293.          BL    WAITEXIT       YES, EXIT WAIT NOW
  294.          CL    R0,TARGET
  295.          BL    WAITLOOP
  296. WAITEXIT EQU   *
  297.          L     R13,4(R13)
  298.          LM    R14,R12,12(R13)
  299.          SR    R15,R15
  300.          BR    R14
  301. *
  302. *  COMMON SUPPORT ROUTINES
  303. *
  304. *  GETID - R1 = GATE NAME IN ASCII PADDED TO 8 CHARACTERS/ DX SET TO GATE ID
  305. *
  306. GETID    EQU   *
  307.          BALR  R8,0
  308.          USING *,R8
  309.          ST    R14,RTNSAV14
  310.          SVC   CVVASG          CONVERT R1=VA TO R0=SEG:OFF
  311.          STCM  0,X'C',PCES
  312.          STCM  0,X'3',PCDI     SET ES:DI TO NAME ID REQUEST PARM
  313.          MVC   PCAX,=X'8100'
  314.          LA    1,PCB
  315.          SVC   TRACE
  316.          DC    C'GID'
  317.          BAL   R10,APISVC      ISSUE 7AH API INTERRUPT WITH PCB REGS VIA SVC
  318.          L     R14,RTNSAV14
  319.          BR    R14
  320. *
  321. * UNLOCK KEYBOARD WAIT LOOP
  322. *
  323. UNLOCK   EQU   *                RETRY READ ON KEYBAORD INHIBIT
  324. *
  325. *  CHECK IF INPUT INHIBITED AND REPEAT UNTIL CLEAR
  326. *
  327.          BALR  R8,0
  328.          USING *,R8
  329.          ST    R14,RTNSAV14
  330.          STM   R1,R2,UNLKSAVE
  331. UNLKLOOP EQU   *
  332.          SVC   TRACE
  333.          DC    C'ULK'
  334.          MVC   PCAX,=X'0902'    SET PARMS TO OBTAIN OIAM INHIBIT STATUS
  335.          MVC   PCBX,=X'8020'
  336.          MVC   PCCX,=X'00FF'
  337.          MVC   PCDX,OIAGID
  338.          LA    R1,OIAMPARM
  339.          SVC   CVVASG
  340.          STCM  0,X'C',PCES
  341.          STCM  0,X'3',PCDI     SET ES:DI TO OIAM PARM
  342.          MVC   OIAMPARM(9),=XL9'00' CLEAR PARM
  343.          MVC   OIAMPARM+2(1),SESSID
  344.          LA    R1,OIABUF
  345.          SVC   CVVASG           CONVERT BUFFER TO SEG:OFFSET
  346.          STCM  0,X'8',OIAMPARM+6+1
  347.          STCM  0,X'4',OIAMPARM+6
  348.          STCM  0,X'2',OIAMPARM+4+1 STORE SEG:OFF TO BUFFER
  349.          STCM  0,X'1',OIAMPARM+4   STORE SEG:OFF TO BUFFER
  350.          MVI   OIAMPARM+8,X'08'    SET REQUIRED PARM
  351.          SVC   TRACE
  352.          DC    C'OIA'
  353.          BAL   R10,APISVC      GET OIA INHIBIT STATUS
  354.          CLI   OIAMPARM,0      CHECK API OIA RETURN CODE (SEE 2-74)
  355.          BNE   APIERR
  356.          TM    OIABUF,X'38'    TEST FOR ANY CHECK
  357.          BNZ   APIERR
  358.          TM    OIABUF,X'07'    TEST FOR INHIBIT
  359.          BNZ   UNLKLOOP        YES, RETRY
  360.          LM    R1,R2,UNLKSAVE
  361.          L     R14,RTNSAV14    EXIT WHEN KEYBOARD UNLOCKED
  362.          BR    R14
  363. *
  364. * API SVC
  365. *
  366. APISVC   EQU   *
  367.          BALR  R7,0
  368.          USING *,R7
  369.          LR    R1,R11
  370.          SVC   TRACE
  371.          DC    C'API '
  372. ***
  373.          SVC   INT86
  374. ***                            ******* NOP SVC FOR TEST  **********
  375. *        MVC   PCCX,=X'1200'   ******* FORCE RC FOR TEST **********
  376. ***
  377.          SR    R15,R15
  378.          IC    R15,PCCX+1      SET R15 = RC
  379.          CLC   PCCX,=X'1200'   CHECK API ID AND SYSTEM RETURN CODE
  380.          BNE   APIERR
  381.          BR    R10
  382. *
  383. *  FORCE INTERACTIVE DEBUG ON API ERROR FOR NOW
  384. *
  385. APIERR   EQU   *
  386.          SVC   TRACE
  387.          DC    C'BUG '
  388.          SVC   EXIT
  389. *
  390. *  COMMON DATA
  391. *
  392.          LTORG
  393. SESGID   DC    H'0'    SESSMGR GATE ID
  394. KEYGID   DC    H'0'    KEYBOARD GATE ID
  395. CPYGID   DC    H'0'    COPY GATE ID
  396. OIAGID   DC    H'0'    OIAM GATE ID
  397.          DC    C'*** OIAMPARM ***'
  398. OIAMPARM DC    XL9'00'
  399.          DC    C'*** OIABUF ***'
  400. OIABUF   DC    XL5'00'
  401.          DC    C'*** QSIDPARM ***'
  402. QSIDPARM DS    0X      QUERY SESSION ID PARMLIST  2-12
  403.          DC    X'00'   RETURN CODE
  404.          DC    X'00'   FUNCTION CODE
  405.          DC    X'01'   OPTION CODE
  406.          DC    X'45'   DATA CODE
  407. QSIDNAOF DC    AL2(0)  OFFSET  TO  NAME ARRAY
  408. QSIDNASG DC    AL2(0)  SEGMENT FOR NAME ARRAY
  409.          DC    CL8"SESSION" SESSION LONG NAME
  410.          DC    C'*** QSNARRAY ***'
  411. QSNARRAY DS    0X      QUERY SESSION ID NAME ARRAY 2-13
  412.          DC    X'0E'   NAME ARRAY LENGTH (MANUAL SHOWS X'14' ?)
  413.          DC    X'00'   NUMBER OF MATCHING SESSIONS
  414.          DC    X'00'   SHORT NAME OF SESSION
  415.          DC    X'00'   TYPE OF SESSION
  416. SESSID   DC    X'00'   SESSION ID
  417.          DC    X'00'   RESERVED
  418.          DC    CL8"SESSION" LONG NAME OF SESSION
  419.          DC    C'*** KEYPARM ***'
  420. KEYPARM  DC    XL12'00' KEYBOARD AID AND WRITE LIST PARM
  421.          DC    C'*** CPYPARM ***'
  422. CPYPARM  DC    XL26'00' SCREEN COPY PARM
  423. ADDRAPI  DC    A(0)    API INTERRUPT ADDRESS TESTED FOR NOT ZERO
  424. TARGET   DC    F'0'    TIME IN 100TH SECONDS AT END OF WAIT INTERVAL
  425. NOW      DC    F'0'    CURRENT TIME FOR MIDNIGHT CHECK
  426. APISAVE  DC    18F'0'
  427. RTNSAV14 DC    A(0)
  428. UNLKSAVE DC    2F'0'
  429. PCB      DS    0F PC REGISTER AREA FOR MS-DOS INTERRUPTS VIA SVC 34
  430.          DC    C'PCVT' IDENTIFIER REQUIRED BY SVC 34
  431.          DC    X'007A' INTERRUPT FOR API COMMUNICATION WITH PC 3270 EMULATION
  432.          DC    H'0'    FLAG STATUS AFTER INTERRUPT
  433.          DC    4H'0'   AX-DX
  434.          DC    4H'0'   DS,SI,ES,DI
  435.          DC    C'*** BUFFER ***'
  436. TRTTAB   DC    X'20',255AL1(*-TRTTAB) CVT X'00' TO ASCII BLANK
  437. ASCICODE EQU   X'40' ASCII SHIFT CODE (SEE A-2)
  438. SCANCODE EQU   X'00' SCAN  SHIFT CODE
  439. ENTERKEY EQU   X'58' SCANCODE ENTER KEY
  440. WTRAN    DS    XL(2*1920+2+2) WORK AREA FOR ASCII TRANSACTION WITH SCANCODES
  441. BUFFER   DS    XL(2*1920) WORK AREA FOR PC ASCII AND ATTRIBUTES COPY OF SCREEN
  442.          COPY  CPY\EQUREGS
  443.          COPY  CPY\EQUSVCS
  444.          COPY  CPY\IHAPCB
  445.          END
  446.